/**
 * @file fri_manage.c
 * @author TimeChicken (https://gitee.com/Time--Chicken)
 * @brief 好友管理服务函数实现
 * @version 0.1
 * @date 2021-08-23
 * 
 * @copyright Copyright (c) 2021
 * 
 */
#include "fri_manage.h"

struct friends *f_list = NULL; //全局好友列表
int friends_count = 0;

/**
 * @brief 初始化好友列表链表
 * 
 */
void init_friends_link(void)
{
    f_list = malloc(sizeof(friends));
    f_list->ip_str = inet_addr("0.0.0.0");
    if (f_list == NULL)
    {
        perror("malloc fail");
        return ;
    }
    INIT_LIST_HEAD(&(f_list->l));
}

/**
 * @brief 删除好友列表链表
 * 
 */
void uninit_friends_link(void)
{
    friends *f, *f_tmp;
    list_for_each_entry_safe(f, f_tmp, &(f_list->l), l)
        free(f);
    f_list = NULL;
}

/**
 * @brief 移除在线好友
 * 
 * @param ip 要移除的IP
 * @return int 成功返回0，失败返回负值
 */
int friends_del(in_addr_t ip)
{
    friends *f, *f_dest = NULL;
    list_for_each_entry(f, &(f_list->l), l)
    {
        if (f->ip_str == ip)
            f_dest = f;
    }
    if(f_dest != NULL)
    {
        list_del(&(f_dest->l));
        return 0;
    }
    else
        return -1;
}

/**
 * @brief 插入好友列表
 * 
 * @param ip IP字符串
 * @return int 插入成功返回0， 失败返回负值
 */
int friends_add(in_addr_t ip)
{
    friends *f = malloc(sizeof(friends));
    f->ip_str = ip;
    list_add_tail(&(f->l), &(f_list->l));
    return 0;
}

/**
 * @brief 打印在线好友列表
 * 
 * @return int 成功返回0，失败返回负值
 */
int friends_print()
{
    friends *f;
    struct in_addr i_a;
    printf("Online friend records:\n");
    list_for_each_entry(f, &(f_list->l), l)
    {
        i_a.s_addr = f->ip_str;
        printf("%s\n", inet_ntoa(i_a));
    }
    printf("get friends list done.\n");
}
